package crontab

import (
	"fmt"
	"github.com/robfig/cron/v3"
	"sync"
)

// https://www.cnblogs.com/jssyjam/p/11910851.html

// 定时任务管理器
type Crontab struct {
	inner *cron.Cron
	mutex sync.Mutex
}

// @title  new新的定时任务引擎
func NewCrontab() *Crontab {
	// cron.New() 默认从分开始，cron.WithSeconds() 加上后默认从秒开始
	return &Crontab{inner: cron.New(cron.WithSeconds())}
	//return &Crontab{inner: cron.New(), ids: map[string]cron.EntryID{}}
}

// 引擎开始
func (c *Crontab) Start() {
	c.inner.Start()
}

// 停止引擎
func (c *Crontab) Stop() {
	c.inner.Stop()
}

// @title 删除任务
// @param id 唯一任务id
func (c *Crontab) DelByID(EntryID cron.EntryID) {
	c.mutex.Lock()
	defer c.mutex.Unlock()
	c.inner.Remove(EntryID)
}

// @title    实现接口的方式添加定时任务
// @param id     唯一任务id
// @param spec    配置定时执行时间
// @param cj    需要执行的任务方法
// @return error
func (c *Crontab) AddJobByInterface(id string, spec string, cj cron.Job) (cron.EntryID, error) {
	c.mutex.Lock()
	defer c.mutex.Unlock()
	eid, err := c.inner.AddJob(spec, cj)
	if err != nil {
		return 0, err
	}
	return eid, nil
}

// @title    添加函数作为定时任务
// @param id    唯一任务id
// @param spec    配置定时执行时间
// @param f    需要执行的方法
// @return error
func (c *Crontab) AddJobByFunc(spec string, f func()) (cron.EntryID, error) {
	c.mutex.Lock()
	defer c.mutex.Unlock()
	eid, err := c.inner.AddFunc(spec, f)
	if err != nil {
		return 0, err
	}
	return eid, nil
}

// @title    判断是否存在任务
// @descript
// @param EntryID    唯一任务 id
// @return bool
func (c *Crontab) IsExistsJob(EntryID cron.EntryID) bool {
	exist := false
	if c.inner.Entry(EntryID) != (cron.Entry{}) { // 判断获取的结构体是否为空
		exist = true
	}
	return exist
}

func (c *Crontab) Entries() []cron.Entry {
	return c.inner.Entries()
}

type testTask struct {
}

func (t *testTask) Run() {
	fmt.Println("hello world 1")
}
